package de.tudarmstadt.ukp.muip.fibqdojo.visitor;

import com.google.common.base.Optional;

import de.tudarmstadt.ukp.muip.fibqdojo.Sentence;
import de.tudarmstadt.ukp.muip.fibqdojo.SentenceToken;
import de.tudarmstadt.ukp.muip.fibqdojo.Token;
import de.tudarmstadt.ukp.muip.fibqdojo.interfaces.IFIBQSentenceToken;
import de.tudarmstadt.ukp.muip.fibqdojo.interfaces.IFIBQToken;
import de.tudarmstadt.ukp.muip.fibqdojo.interfaces.IStructureVisitor;
import de.tudarmstadt.ukp.muip.fibqdojo.japanese.JapaneseToken;

public class CopySentenceTokenVisitor implements IStructureVisitor {

    private Optional<IFIBQSentenceToken> copy = Optional.absent();

    public Optional<IFIBQSentenceToken> getCopy() {
        return copy;
    }

    @Override
    public void visit(JapaneseToken token) {
    }

    @Override
    public void visit(Token token) {
    }

    @Override
    public void visit(SentenceToken sentToken) {
        Integer sentencePosition = sentToken.getSentencePosition();
        Optional<IFIBQToken> token = copyToken(sentToken);
        if (token.isPresent()) {
            SentenceToken copiedSentToken = new SentenceToken(token.get(), sentencePosition);
            setMarking(sentToken, copiedSentToken);
            copy = wrapToken(copiedSentToken);
        }
    }

    private Optional<IFIBQSentenceToken> wrapToken(SentenceToken copiedSentToken) {
        IFIBQSentenceToken wrap = (IFIBQSentenceToken) copiedSentToken;
        return Optional.of(wrap);
    }

    private void setMarking(SentenceToken sentToken, SentenceToken copiedSentToken) {
        boolean marked = sentToken.isMarkedBlank();
        copiedSentToken.setBlank(marked);
    }

    private Optional<IFIBQToken> copyToken(SentenceToken sentToken) {
        CopyTokenVisitor visitor = new CopyTokenVisitor();
        sentToken.getToken().accept(visitor);
        return visitor.getCopy();
    }

    @Override
    public void visit(Sentence sentence) {
    }

}
